#include <types.h>

u64 add(u64 a, u64 b)
{
	u64 c;

	while (c = a & b) {
		a = a ^ b;
		b = c << 1;
	}

	return a ^ b;
}

u64 sub(u64 a, u64 b)
{
	return add(a, -b);
}

u64 imul(u64 a,u64 b)
{
	u64 c, i;
	c = 0;
	for(i = 0;i < 64;i ++) {
		if(b & (1 << i))
			c = add(c, a << i);
	}
	return c;
}

u64 idiv(u64 a, u64 b)
{
	u64 i;
	u64 m = 0;

	for (i = 1; i <= 64; i++)
	{
		m = (m << 1) | (a >> 31);
		a = a << 1;
		if (m >= b)
		{
			m = add (m, -b);    //m = m - b;
			a = add (a, 1); //a = a + 1;
		}
	}

	return a;
}
